Feld generisch umsetzen
Aus verschiedenen Gründen könnte es sein, dass Sie Werte eines bestimmten Feldes auf der Datenbank ändern möchten. Normalerweise schreiben Sie dazu ein Programm, dass die Daten für jede Tabelle einliest, das Feld ändert und die Daten wieder zurück schreibt. Wir präsentieren Ihnen hier eine generelle Lösung…
Das folgende Programm enthält eine Routine, mit der Sie generell ein Feld in einer beliebigen Tabelle ändern können.
Die Umsetzung müssen Sie für Ihren Fall natürlich anpassen.
Problemstellung
In einem CHAR(6)-Feld steht eine Nummer mit führenden Nullen, z.B. 000034. Das zugrundeliegende Datenelement soll ab auf ein zweistelliges Characterfeld umgesetzt werden. Bei einer Änderung und anschliessenden Umsetzung der Datenbank würden einfach die ersten beiden Stellen (00) genommen werden. Die eigentliche Information geht also verloren. Handelt es sich um ein Schlüsselfeld, so gehen gehen sogar Datensätze verloren!
Lösungsansatz
In diesem speziellen Fall wird die sechsstellige Nummer, die in einem Characterfeld gespeichert ist, auf eine zweistellige Nummer umgesetzt.
Da es sich um ein Schlüsselfeld handelt, werden die vorhandenen Datensätze gelesen, gelöscht, umgesetzt und anschließend wieder eingefügt.
Coding
*———————————————————————*
* Report ZZUMS1
*———————————————————————*
REPORT zzums1.
PARAMETERS p_u1 AS CHECKBOX DEFAULT space.
PARAMETERS p_u2 AS CHECKBOX DEFAULT space.
START-OF-SELECTION.
IF p_u1 <> space.
PERFORM change USING ‘ZZTAB1’.
ENDIF.
IF p_u2 <> space.
PERFORM change USING ‘ZZTAB2’.
ENDIF.
*&———————————————————————*
*& Form change
*&———————————————————————*
FORM change USING fi_tabname.
*** data
DATA dref TYPE REF TO data.
FIELD-SYMBOLS <table> TYPE ANY TABLE.
FIELD-SYMBOLS <wa> TYPE ANY.
FIELD-SYMBOLS <value> TYPE ANY.
*** create table dynamically
CREATE DATA dref TYPE STANDARD TABLE OF (fi_tabname).
*** assign referenced table to table-field-symbol
ASSIGN dref->* TO <table>.
*** Print protocol
WRITE: / fi_tabname.
*** Select data into internal table
SELECT * FROM (fi_tabname) INTO TABLE <table>.
IF sy-subrc = 0.
*** in this case the field to be changed is a key field…
*** delete existing entries
DELETE (fi_tabname) FROM TABLE <table>.
*** set new value for each entry
LOOP AT <table> ASSIGNING <wa>.
ASSIGN COMPONENT ‘FIELDNAME’ OF STRUCTURE <wa> TO <value>.
IF sy-subrc = 0.
SHIFT <value> LEFT BY 4 PLACES.
ENDIF.
ENDLOOP.
*** and insert changed entries
INSERT (fi_tabname) FROM TABLE <table>.
IF sy-subrc = 0.
*** everything ok: commit changes
WRITE: ‘Modify ok, Entries:’, sy-dbcnt.
COMMIT WORK.
ELSE.
*** something went wrong: rollback
WRITE: ‘Modify failure!’.
ROLLBACK WORK.
ENDIF.
ELSE.
*** protocol
WRITE: ‘Nothing selected…’.
ENDIF.
ENDFORM.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024